"""
请求钩子

- 解释：当访问正常视图函数的时候，顺带执行的方法
- 常见的请求钩子有四种：

- 1. before_first_request：在处理第一个请求前执行【已不使用】
- 2. before_request：在每次请求前执行，在该装饰函数中，一旦return，视图函数不再执行
- 3. after_request：如果没有抛出错误，在每次请求后执行
    接收一个参数：视图函数作出的响应
    在此函数中可以对响应值，在返回之前做最后一步处理，再返回
- 4. teardown_request：再每次请求后执行
    接收一个参数：用来接收错误信息


- 顺序：
1. before_request
2. after_request
3. teardown_request
"""

from flask import Flask

app = Flask(__name__)


# 在flask2.3版本之后,该装饰器的功能在创建应用时运行，无需手动添加该装饰器
# @app.before_first_request
# def before_first_request():
#     print("before_first_request")


# 每次请求前都执行，适合对请求参数做校验，访问统计
@app.before_request
def before_request():
    print("before_request")


# 视图函数执行之后，返回该方法，适合对返回值做统一处理
@app.after_request
def after_request(resp):
    print("after_request")
    resp.headers["Content-Type"] = "application/json"
    return resp


# 请求销毁之后执行
@app.teardown_request
def teardown_request(e):
    print("teardown_request")


@app.route("/")
def helloworld():
    return "hello world Flask"


if __name__ == "__main__":
    app.run(debug=True)
